/**
 * new执行以下几个步骤：
1.  创建一个空对象：new操作符会创建一个新的空对象，该对象继承自构造函数的原型对象。
2.  设置对象的原型链：新创建的空对象的__proto__属性会被设置为构造函数的prototype属性，这样就建立了对象与构造函数原型之间的连接。
3.  执行构造函数代码：将新创建的空对象作为this关键字绑定到构造函数，并执行构造函数内部的代码。这样，构造函数可以通过this来操作和设置新对象的属性和方法。
4.  返回新对象实例：如果构造函数没有显式返回值，则new操作符会隐式返回新创建的对象实例。如果构造函数有返回值，有以下两种情况：
    -   如果返回值是一个对象，则new操作符会返回该对象。
    -   如果返回值不是一个对象（比如基本数据类型），则忽略返回值，返回新创建的对象。

 * @param {*} constuctor 构造函数
 * @param  {...any} rest  其他参数
 */
function myNew(constuctor, ...rest) {
  if (typeof constuctor !== "function") {
    throw new Error("参数一必须是构造函数");
  }

  // 创建空对象，绑定原型
  let obj = Object.create(constuctor.prototype);
  // 执行构造函数
  let result = constuctor.apply(obj, rest);
  // 返回,result是对象或者函数都应该返回result
  return result && Object(result) === result ? result : obj;
}
